cairo_restore (cr);
}
-typedef struct _CursorInfo CursorInfo;
-
-struct _CursorInfo
-{
- GType for_type;
- GdkColor primary;
- GdkColor secondary;
-};
-
static void
-cursor_info_free (gpointer data)
+get_cursor_color (GtkWidget *widget,
+ gboolean primary,
+ GdkColor *color)
{
- g_slice_free (CursorInfo, data);
-}
+ GtkStyleContext *context;
+ GdkColor *style_color;
-static const GdkColor *
-get_insertion_cursor_color (GtkWidget *widget,
- gboolean is_primary)
-{
- CursorInfo *cursor_info;
- GtkStyle *style;
- GdkColor *cursor_color;
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ g_return_if_fail (color != NULL);
+
+ context = gtk_widget_get_style_context (widget);
- style = gtk_widget_get_style (widget);
+ gtk_style_context_get_style (context,
+ primary ? "cursor-color" : "secondary-cursor-color",
+ &style_color,
+ NULL);
- cursor_info = g_object_get_data (G_OBJECT (style), "gtk-style-cursor-info");
- if (!cursor_info)
+ if (style_color)
{
- cursor_info = g_slice_new (CursorInfo);
- g_object_set_data_full (G_OBJECT (style), I_("gtk-style-cursor-info"),
- cursor_info, cursor_info_free);
- cursor_info->for_type = G_TYPE_INVALID;
+ *color = *style_color;
+ gdk_color_free (style_color);
}
-
- /* We have to keep track of the type because gtk_widget_style_get()
- * can return different results when called on the same property and
- * same style but for different widgets. :-(. That is,
- * GtkEntry::cursor-color = "red" in a style will modify the cursor
- * color for entries but not for text view.
- */
- if (cursor_info->for_type != G_OBJECT_TYPE (widget))
+ else if (primary)
{
- cursor_info->for_type = G_OBJECT_TYPE (widget);
+ GdkRGBA fg;
- /* Cursors in text widgets are drawn only in NORMAL state,
- * so we can use text[GTK_STATE_NORMAL] as text color here
- */
- gtk_widget_style_get (widget, "cursor-color", &cursor_color, NULL);
- if (cursor_color)
- {
- cursor_info->primary = *cursor_color;
- gdk_color_free (cursor_color);
- }
- else
- {
- cursor_info->primary = style->text[GTK_STATE_NORMAL];
- }
+ gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg);
- gtk_widget_style_get (widget, "secondary-cursor-color", &cursor_color, NULL);
- if (cursor_color)
- {
- cursor_info->secondary = *cursor_color;
- gdk_color_free (cursor_color);
- }
- else
- {
- /* text_aa is the average of text and base colors,
- * in usual black-on-white case it's grey. */
- cursor_info->secondary = style->text_aa[GTK_STATE_NORMAL];
- }
+ color->red = fg.red * 65535;
+ color->green = fg.green * 65535;
+ color->blue = fg.blue * 65535;
}
-
- if (is_primary)
- return &cursor_info->primary;
else
- return &cursor_info->secondary;
+ {
+ GdkRGBA fg;
+ GdkRGBA bg;
+
+ gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg);
+ gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
+
+ color->red = (fg.red + bg.red) * 0.5 * 65535;
+ color->green = (fg.green + bg.green) * 0.5 * 65535;
+ color->blue = (fg.blue + bg.green) * 0.5 * 65535;
+ }
}
void
_gtk_widget_get_cursor_color (GtkWidget *widget,
GdkColor *color)
{
- GdkColor *style_color;
-
- g_return_if_fail (GTK_IS_WIDGET (widget));
- g_return_if_fail (color != NULL);
-
- gtk_widget_style_get (widget, "cursor-color", &style_color, NULL);
-
- if (style_color)
- {
- *color = *style_color;
- gdk_color_free (style_color);
- }
- else
- *color = gtk_widget_get_style (widget)->text[GTK_STATE_NORMAL];
+ get_cursor_color (widget, TRUE, color);
}
/**
gint x, y;
gfloat cursor_aspect_ratio;
gint offset;
+ GtkStyleContext *context;
+ GdkColor color;
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (cr != NULL);
g_return_if_fail (location != NULL);
g_return_if_fail (direction != GTK_TEXT_DIR_NONE);
- gdk_cairo_set_source_color (cr, get_insertion_cursor_color (widget, is_primary));
+ context = gtk_widget_get_style_context (widget);
+
+ get_cursor_color (widget, is_primary, &color);
+ gdk_cairo_set_source_color (cr, &color);
/* When changing the shape or size of the cursor here,
* propagate the changes to gtktextview.c:text_window_invalidate_cursors().
*/
- gtk_widget_style_get (widget, "cursor-aspect-ratio", &cursor_aspect_ratio, NULL);
+ gtk_style_context_get_style (context,
+ "cursor-aspect-ratio", &cursor_aspect_ratio,
+ NULL);
stem_width = location->height * cursor_aspect_ratio + 1;
arrow_width = stem_width + 1;